Signed and Unsigned Numbers
Unsigned Numbers 沒負號
若有一 4 digit 10進位系統
可表達範圍 0~9999
若有一 4 digit 2進位系統
可表達範圍 0~ //換成10進位也就是
Signed Numbers 有負號
- 方法一 : Signed magnitude
用一個bit代表負號
1負0正
例如 :
111代表-3
最左邊的1是最高位拿來判斷正負
- 方法二 : 補數
把要處理的數字將他拿來取multi complement
1's complement :
如果原本的數字是1
那麼他的logic complement就為0
反之 如果是0
那麼他就會是1
例如 :
000的complement就是111
+0 -0
比較表 :
但是不論用方法一或是方法二都會有個問題
我們會有兩個0一個是正的0 一個是負的0
會讓我們無法使用過去傳統我們所設計的加法器unsigned adder
我們需要一個更好的 signed number的representation
能夠延用過去我們所設計的unsigned的加法器
讓它可以自動的延伸來做 "signed number的加法"
更好的解決辦法 : 2's complement
假設有一個2 digit的10進位里程表
可以表達的範圍是 [ 00mile到99mile ]
"假設99mile我們在 往前一個mile"
實際上里程表會表現出來的應該是100mile
(然而因為我們只是2 digit 所以我們會把這個進位 也就是100 百位 自動的忽略)
也因此"最後實際上會是00"
同理
如果現在是"0mile 往後到退1個mile"
實際上我們會是0-1
應該是-1
但因為我們的里程表是2 digit
所以最後的結果我們看到的是一個借位的現象
而這個借位是自動的被進行的
也因此"最後實際上會是99"
從這個例子我們可以知道
99跟-1在意義上是相當接近的
用里程表的概念來設計negative number
problem1: 0應該要被安排在哪裡?
如果我們把它選擇在0~99的中間的話
那麼可以是49 50 或51
然而無論是哪一種,絕對都不是一個好的方法
因為我們希望可以沿用原本的0 (希望00代表的也是0的意思)
既然99+1會等於0
我們可以把它想成這個里程表是一個(curculer) 環狀的結構
也因此
我們可以自動的把一些數值做一個旋轉的動作
而經過旋轉之後
我們就可以把0放在中間
而1 2 3將會代表正的數字
99 98 97 將會代表負的數字
problem2: 100當作4或-1誰比較好?
把這個概念延伸成binary的里程表
我們可以看到我們有兩種不同的選擇
第一個選擇是我們讓100代表-4
第二個選擇是我們讓100代表+4
哪一個選擇比較好呢?
Answer
選擇左邊
主要的原因非常的顯而易見
因為在這裡我們注意到
****
所有的高位元為0的時候代表的是正數
而所有的高位元為1的時候代表的是負數
****
2's complement 特性:
低位元代表的是一個正數
而高位元代表的是一個很大的負數
也因此我們透過低位元跟高位元的相加
我們就可以得到有號數
例子 :
有8個digit的二進位的數字
@最高位元b7
代表的是一個負的數字
實際上它是-b7乘上2的7次方
@剩下的低位元
這7個數字則代表的是正的數字
分別依照它所對應的 2的冪次方 來代表它
所以可以表達的數字範圍
將會在1後面7個0 到0後面7個1
(2的-7次方到正的2的7次方減1)
最終比較 :
Sign Extension :
把3bit延伸成為4bit
證明 :
假設有一個3bit的 binary signed number
可以把他表示成為
如果我們想要把這個3bit延伸成為4bit
那麼可以預期的是我們可以把最低的這三個bit直接搬移過來
然而最高的這個bit應該如何處理呢
我們試著把新的數字用一個數學式子來代表它
因為我們希望A跟A'要是一樣的
所以 :
a3會等於a2
結論 :
當我們想要去把我們的資料從比較少的位元數
搬移到一個比較大的儲存空間的位元數的時候
要做的就是把它的sign bit拿來直接做延伸
"只要複製它的最高位元就可以確保我們最後表達的數字其實是一樣的"